home *** CD-ROM | disk | FTP | other *** search
/ Stolen Data 1 / Stolen Data 1.adf / Source / Mouse_bobs.s < prev    next >
Text File  |  1989-11-02  |  7KB  |  346 lines

  1.     Incdir    Df1:
  2.     Include    Source/CustomRegisters
  3.  
  4. ;-- CustomRegisters is an include file which defines all the custom
  5. ;-- chip registers I use and also creates three macros which make
  6. ;-- creating copperlists much easier ( Mov, Wait, Skip )
  7.  
  8. *************************************************************************
  9. *****    Sorry but these examples will only work with DEVPAC II    ******
  10. *****    despite what I said in the magazine                       ******
  11. *************************************************************************
  12.  
  13. Ciaapra        = $BFE001    ;CIA port a register, bit 6 is used for
  14.                 ;the left mouse button, and bit 1 toggles
  15.                 ;the power LED which is connected to the
  16.                 ;low pass filter
  17. Oldopenlibrary    = -$198        ;Open a library of functions, a pointer
  18.                 ;to the library name is sent in a1,
  19.                 ;ignores the library version no.
  20. Disable        = -$78        ;Switch off interrupts,and multitasking
  21.                 ;( taskswitching occurs in the vertical
  22.                 ;blanking interrupt )
  23. Enable        = -$7e        ;Enable interrupts,including multitasking
  24. Startlist    = 38        ;The standard workbench copperlist.
  25. Execbase    = 4        ;A pointer to the EXEC library which
  26.                 ;contains all the fundamental operating
  27.                 ;system routines.
  28.  
  29.     Move.l    Execbase,a6
  30.     Jsr    Disable(a6)    ;Disable interrupts
  31.     Bsr    Setup
  32.  
  33.  
  34. ;------ Wait for Vertical position 1 --------
  35.  
  36. Wait    Move.l    Vposr,d2
  37.     And.l    #$0001ff00,d2
  38.     Cmp.l    #$00010800,d2
  39.     Bne.s    Wait
  40.  
  41. ;-- Clear the previous bobs
  42.  
  43.     Lea    Xs(pc),a3
  44.     Lea    Ys(pc),a4
  45.     Move    Pointer(pc),d6
  46.     Moveq    #15,d7
  47. Clear_bobs
  48.     Move    (a3,d6),d0
  49.     Move    (a4,d6),d1
  50.     Bsr    Bob_clr
  51.     Subq    #8,d6
  52.     And    #$7e,d6
  53.     Dbf    d7,Clear_bobs
  54.  
  55. ;-- Check the mouse and update the bob position accordingly
  56.  
  57.     Addq    #2,Pointer
  58.     And    #$7e,Pointer
  59.  
  60.     Bsr    Mousey
  61.  
  62. ;-- Now plot the bobs in their new positions
  63.  
  64.     Move    Pointer(pc),d6
  65.     Moveq    #15,d7
  66. Draw_bobs
  67.     Move    (a3,d6),d0
  68.     Move    (a4,d6),d1
  69.     Bsr    Bob_draw
  70.     Subq    #8,d6
  71.     And    #$7e,d6
  72.     Dbf    d7,Draw_bobs
  73.  
  74.     Btst    #6,Ciaapra    ;Have you pressed the left button
  75.     Bne.s    Wait
  76.  
  77. ;------ Restore old Copper list -----------
  78.  
  79.     Move.l    Execbase,a6
  80.     Move.l    #Grname,a1
  81.     Clr.l    d0
  82.     Jsr    Oldopenlibrary(a6)    ;Open the graphics library
  83.     Move.l    d0,a4
  84.     Move.l    Startlist(a4),Cop1lc    ;Restore the old copperlist
  85.     Clr.w    Copjmp1
  86.     Move.w    #$83E0,Dmacon
  87.     Jsr    Enable(a6)        ;Re-enable the interrupts
  88.     Clr.l    d0            ;No return-code errors
  89.     Rts
  90.  
  91. ;-------- Setup routine ----------
  92.  
  93. Setup
  94.     Move.w    #$8780,Dmacon    ;Make sure copper,blitter and other
  95.                 ;DMA is switched on.
  96.     Move.w    #$0020,Dmacon    ;Turn off sprite DMA
  97.  
  98.  
  99.     Lea    Spr0data,a0    ;Now clear all sprite data to eliminate
  100.     Moveq    #7,d0        ;the lines you occasionaly get if you
  101. Spr_clr                ;forget to do this.
  102.     Clr.l    (a0)        ;Clear both data words simultaneously
  103.     Addq.l    #8,a0
  104.     Dbf    d0,Spr_clr
  105.  
  106. ;-- Clear the screen
  107.  
  108.     Move.l    Bob_scr(pc),a0
  109.     Move    #$f9f,d0
  110. Clr_scr
  111.     Clr.l    (a0)+
  112.     Dbf    d0,Clr_scr
  113.  
  114. ;-- Create the mask
  115.  
  116.     Lea    Bob_data(pc),a0
  117.     Lea    Width(a0),a1
  118.     Lea    Bob_mask(pc),a2
  119.     Lea    Width(a2),a3
  120.  
  121.     Move    #Length-1,d1
  122. Mask_loop2
  123.     Move    #Width/2-1,d0
  124. Mask_loop1
  125.     Move    (a0)+,d2
  126.     Or    (a1)+,d2
  127.     Move    d2,(a2)+
  128.     Move    d2,(a3)+
  129.     Dbf    d0,Mask_loop1
  130.  
  131.     Lea    Width(a0),a0
  132.     Lea    Width(a1),a1
  133.     Lea    Width(a2),a2
  134.     Lea    Width(a3),a3
  135.     Dbf    d1,Mask_loop2
  136.     
  137. ;-- Reset the mouse counters
  138.  
  139.     Move    Joy0dat,d0
  140.     Move    d0,d1
  141.     And    #$ff,d0
  142.     Move    d0,Last_posx
  143.     Lsr    #8,d1
  144.     Move    d1,Last_posy
  145.  
  146.     Move.l    #Clstart,Cop1lc        ;Start up my own copperlist
  147.     Clr    Copjmp1
  148.     Rts
  149.  
  150.  
  151. Blit_wait
  152.     Btst    #14,Dmaconr
  153.     Bne.s    Blit_wait
  154.     Rts
  155.  
  156. ;--------- Mouse routine ----------
  157. Last_posy    Dc.w 0
  158. Last_posx    Dc.w 0
  159.  
  160. Mousey
  161.     Move    Last_posy(pc),d0
  162.     Move    Joy0dat,d1
  163.     Lsr    #8,d1
  164.     Move    d1,Last_posy
  165.     Sub    d1,d0
  166.     Bmi.s    Negative
  167.     Cmp    #127,d0
  168.     Blt.s    Ok
  169.     Sub    #255,d0
  170.     Bra.s    Ok
  171. Negative
  172.     Cmp    #-127,d0
  173.     Bgt.s    Ok
  174.     Add    #255,d0
  175. Ok
  176.     Sub    d0,Ypos
  177.     Bpl.s    Not_too_small
  178.     Clr    Ypos
  179. Not_too_small
  180.     Cmp    #200-Length,Ypos
  181.     Blt.s    Not_too_big
  182.     Move    #199-Length,Ypos
  183. Not_too_big
  184.  
  185.     Move    Last_posx(pc),d0
  186.     Move    Joy0dat,d1
  187.     And    #$ff,d1
  188.     Move    d1,Last_posx
  189.     Sub    d1,d0
  190.     Bmi.s    Negative2
  191.     Cmp    #127,d0
  192.     Blt.s    Ok2
  193.     Sub    #255,d0
  194.     Bra.s    Ok2
  195. Negative2
  196.     Cmp    #-127,d0
  197.     Bgt.s    Ok2
  198.     Add    #255,d0
  199. Ok2
  200.     Sub    d0,Xpos
  201.     Bpl.s    Not_too_small2
  202.     Clr    Xpos
  203. Not_too_small2
  204.     Cmp    #320-Width*8,Xpos
  205.     Blt.s    Not_too_big2
  206.     Move    #319-Width*8,Xpos
  207. Not_too_big2
  208.  
  209.     Lea    Xs(pc),a0
  210.     Lea    Ys(pc),a1
  211.     Move    Pointer(pc),d2
  212.     Move    Xpos(pc),(a0,d2)
  213.     Move    Ypos(pc),(a1,d2)
  214.  
  215.     Rts
  216.  
  217.  
  218. ;--------- Bob routine ----------
  219. Width        = 6
  220. Length        = 31
  221. Bob_pt        Dc.l Bob_data
  222. Msk_pt        Dc.l Bob_mask
  223. Bob_scr        Dc.l $70000
  224. Scr_width    = 40
  225. No_pln        = 2        ;Number of screen bitplanes
  226.  
  227. ;-- Put x,y coordinate in d0,d1 respectively
  228.  
  229. Bob_draw
  230.     Move    d0,d2
  231.     Lsr    #4,d0
  232.     Add    d0,d0        ;Find which word to start drawing the bob on
  233.     Mulu    #80,d1        ;Find the screenline to start
  234.                     ;drawing the bob
  235.     Add    d1,d0
  236.     Move.l    Bob_scr(pc),a0        ;Start of the screen
  237.     Lea    (a0,d0),a0        ;a0 now has the first word to which
  238.                     ;we want to copy the bob
  239.     Bsr    Blit_wait
  240.     Move.l    a0,Bltdpth
  241.     Move.l    a0,Bltcpth        ;Ch.C reads the screen data, Ch A is
  242.                     ;masked with Ch.B, and the masked
  243.                     ;area copied onto Ch.C before being
  244.                     ;sent back to the screen.
  245.     Move.l    Bob_pt(pc),Bltapth    ;Ch.A is used for the bob data
  246.     Move.l    Msk_pt(pc),Bltbpth    ;Ch.B used for the mask,only A&B
  247.                     ;can be shifted remember
  248.     Move.l    #$ffff0000,Bltafwm    ;Mask out the last word from A
  249.     Clr    Bltamod            ;Move back a word
  250.     Clr    Bltbmod
  251.     Move    #Scr_width-Width,Bltcmod    ;Move on to next screen
  252.     Move    #Scr_width-Width,Bltdmod    ;line
  253.  
  254.     And    #$0f,d2
  255.     Ror    #4,d2
  256.     Move    d2,d0
  257.     Swap    d0
  258.     Move    d2,d0            ;This gets the A-B shift value into
  259.                     ;the right place
  260.     Or.l    #$fe20000,d0        ;Use all 4 channels and set the
  261.                     ;minterms for bob use.
  262.     Move.l    d0,Bltcon0
  263.     Move    #Length*No_pln*64+Width/2,Bltsize    ;Blit the bob
  264.  
  265.     Rts        ;This bob routine is not particularly fast
  266.             ;for instance in a demo you would create tables
  267.             ;for x,y position conversions, also some of the
  268.             ;blitter registers do not need to be changed
  269.             ;when plotting a new bob, but as this is supposed
  270.             ;to be a general bob routine I left these
  271.             ;optimisations out. See the 196 bob source for
  272.             ;an example of how far you can take this. Also
  273.             ;I have not used double buffering which is
  274.             ;essential for a large number of bobs.
  275.  
  276. Bob_clr
  277.     Move    d0,d2
  278.     Lsr    #4,d0
  279.     Add    d0,d0
  280.     Mulu    #80,d1
  281.  
  282.     Add    d1,d0
  283.     Move.l    Bob_scr(pc),a0
  284.     Lea    (a0,d0),a0
  285.  
  286.     Bsr    Blit_wait
  287.     Move.l    a0,Bltdpth
  288.     Move    #Scr_width-Width,Bltdmod
  289.     Clr    Bltadat
  290.     Move.l    #$1f00000,Bltcon0
  291.     Move    #Length*No_pln*64+Width/2,Bltsize
  292.  
  293.     Rts
  294. ;--------- Constants -----------
  295.  
  296. Grname    Dc.b    "graphics.library",0
  297.  
  298.     Even
  299.  
  300. ;--------- Variables -----------
  301.  
  302. Pointer    Dc.w 0
  303. Xpos    Dc.w 144
  304. Ypos    Dc.w 84
  305.  
  306. Xs    Dcb.w 64,144
  307. Ys    Dcb.w 64,84
  308.  
  309. ;---------- Copperlists -----------
  310. Clstart
  311.     Mov    $4081,Diwstrt    ;Define the screen window as
  312.     Mov    $08c1,Diwstop    ;320 x 200 starting on line 80
  313.     Mov    $0038,Ddfstrt
  314.     Mov    $00d0,Ddfstop
  315.  
  316.     Mov    0,Bplcon1    ;No scrolling
  317.     Mov    0,Bplcon2    ;Clear bitplane/sprite priorities
  318.  
  319.     Mov    40,Bpl1mod    ;We want the bitplanes to be arranged
  320.     Mov    40,Bpl2mod    ;side by side for faster bob plotting
  321.  
  322.     Mov    0,Bpl1ptl    ;Set the start of the screen
  323.     Mov    7,Bpl1pth    ;memory (must be placed in a
  324.     Mov    40,Bpl2ptl    ;copperlist as it needs to be
  325.     Mov    7,Bpl2pth    ;set every frame)
  326.  
  327.     Mov    $2200,Bplcon0    ;We want a 2 Bitplane, single playfield
  328.                 ;screen
  329.  
  330.     Mov    $000,Color00    ;Black background
  331.     Mov    $00f,Color01    ;Shades of blue for the balls
  332.     Mov    $00c,Color02
  333.     Mov    $008,Color03
  334.  
  335.     Wait    254,255        ;Wait for an impossible position
  336.                 ;tells the copper, this is the end
  337.                 ;of the copperlist
  338.  
  339. ;-------------- Binaries ---------------
  340.  
  341. Bob_data
  342.     Incbin    Binary/Bob
  343. Bob_mask
  344.     Dcb.b    No_pln*Width*Length,0
  345.  
  346.